在練習開發 Compose 時,都是直接用 IntelliJ IDEA 的 Run Configuration 直接把 App 跑起來,雖然方便,但若要讓所有使用者都能用到這個 App 的話,就得先編譯程式碼並打包成各作業系統可使用的安裝執行檔。
Compose for Desktop 專案在建立時,就在 Build Script 裡設定好 org.jetbrains.compose
Gradle Plugin。這個 Plugin 提供許多跟運行、檢查、打包 App 相關的 Task。在 IntelliJ IDEA 裡打開 Gradle 工具視窗,就可以看到 Tasks 底下有 compose desktop
資料夾,裡面有許多常用的指令可以執行,包括:
run
:以 run
為首的指令,會運行 Build Script 裡指定的 mainClass
(該檔案裡需要有 main
函式),在運行時會使用整個 JVM Runtime 且不會預先打包,這樣可以讓運行和除錯更些。假如想要取得最小化 Runtime 且壓縮過的 Binary,請改用 runDistributable
。createDistributable
:用來建立沒有安裝程式的可發佈映像檔。package<FormatName>
:以 package
為首的指令,像是 packageDeb
、packageDmg
、packageMsi
等可以將 App 打包成對應平台的安裝執行檔。若想要一次打包,可以使用 package
指令。不過各平台只能打包自己平台的安裝執行檔,若在單一平台執行全平台打包,則其他平台的指令會自動跳過。建立好的打包檔會放在 ${project.buildDir}/compose/binaries
底下。在打包 App 時,透過修改 Gradle Build Script,就可以調整打包設定,包括:
packageName
:應用程式的名稱,預設為 Gradle 的專案名稱。packageVersion
:應用程式打包的版本號。version
:應用程式的版本號,預設為 Gradle 的專案版本號。description
:應用程式的描述,預設為空。copyright
:應用程式的版權資訊,預設為空。vendor
:應用程式的製作單位,預設為空。licenseFile
:應用程式的授權資訊,預設為空。modules()
自行指定,或用 includeAllModules = true
打包所有 Module。也可以執行 suggestRuntimeModules
Gradle Task,這個指令會用 jdeps 靜態分析工具找出需要的 ModuletargetFormats()
指定要輸出哪些格式,包括 macOS 上的 TargetFormat.Dmg
、Windows 上的 TargetFormat.Msi
及 Linux 上的 TargetFormat.Deb
。compose.desktop {
application {
nativeDistributions {
packageName = "ExampleApp"
packageVersion = "..."
version = "0.1-SNAPSHOT"
description = "Compose Example App"
copyright = "© 2020 My Name. All rights reserved."
vendor = "Example vendor"
licenseFile.set(project.file("LICENSE.txt"))
// 設定要一起打包的 JDK Module(擇一使用)
modules("java.sql")
includeAllModules = true
// 設定支援的發佈格式
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
linux {
// Linux 作業系統專屬的設定
}
macOS {
// macOS 作業系統專屬的設定
}
windows {
// Windows 作業系統專屬的設定
}
}
}
}
在使用 Gradle 打包時需要注意三件事:
除了內建的 Gradle 打包指令外,也有公司開發了功能更多更完整的打包工具,如 Conveyor。若讀者的專案是開放原始碼的話,有免費授權可以使用,不過若是用在商業專案的話,就會需要另外購買 Conveyor 授權。Conveyor 提供了許多 Gradle 指令所沒有的功能,包括:
jdeps
偵測,只打包有使用到的 JDK Module 以減少應用程式的檔案大小。若覺得內建的 Gradle 指令不符合需求,看完以上的功能差異後想要了解 Conveyor 詳細的功能與打包流程,可以參考這篇官方教學